/*
 * Clase que contiene todas las herramientas necesarias para Spider
 * 
 * @author HPCIII_Team2013
 */

package cl.ucn.hpc.spider;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;

import cl.ucn.hpc.almacenamiento.Storage;
import cl.ucn.hpc.descarga.Download;
import cl.ucn.hpc.procesamiento.HTMLProcessing;

public class Tools {
	//Objeto encargado de almacenar informacion
	protected Storage storage;

	/*
	 * Contructor de la clase
	 * 
	 * @param path Directorio general donde debe almacenar la informacion recibida
	 */
	public Tools(String path) {
		storage = new Storage(path);
	}

	/*
	 * Obtiene el contenido integro de la pagina descargada
	 * 
	 * @param url Link de la pagina a descargar
	 * @return Pagina completa con sus anotacions HTML incluidas
	 * @throws IOException Si no puede crear el InputStream
	 */
	protected InputStream fetch(final String url) throws IOException {
		InputStream input = Download.fetch(url);
		return input;
	}

	/*
	 * Obtiene el nombre de la pagina entregada
	 * 
	 * @param url Link de la pagina solicitada
	 * @return Nombre de la pagina
	 * @throws IOException Si no puede acceder a la pagina
	 */
	protected String host(final String url) throws IOException {
		String input = Download.host(url);
		return input;
	}

	/*
	 * Convierte el archivo recibido a texto
	 * 
	 * @param is Archivo a convertir
	 * @return Texto del archivo recibido
	 */
	private static String getStringFromInputStream(InputStream is) {

		if (is == null) {
			return null;
		}

		BufferedReader br = null;
		StringBuilder sb = new StringBuilder();

		String line;
		try {

			br = new BufferedReader(new InputStreamReader(is));
			while ((line = br.readLine()) != null) {
				sb.append(line);
			}

		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (br != null) {
				try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

		return sb.toString();

	}

	/*
	 * Convierte el archivo recibido a texto
	 * 
	 * @param url Archivo 
	 * @return Texto del archivo recibido
	 * @throws IOException Si no puede convertir el archivo
	 */
	protected String htmltext(final InputStream url) throws IOException {
		String text = getStringFromInputStream(url);

		return text;
	}

	/*
	 * Guarda el archivo recibido 
	 * 
	 * @param input Archivo a almacenar
	 * @return El archivo creado para almacenarlo
	 * @throws IOException Si no puede convertir el archivo
	 */
	protected File save(InputStream input, String name) throws IOException {
		File file = storage.save(input, name);
		return file;
	}

	/*
	 * Guarda el texto recibido
	 * 
	 * @param input Texto a almacenar
	 * @param name Nombre del archivo donde se guardara
	 * @return archivo creado
	 * @throws IOException Si no puede crear el archivo
	 */
	protected File save(String input, String name) throws IOException {
		File file = storage.save(input, name);
		return file;
	}

	/*
	 * Elimina las anotaciones HTML del archivo recibido
	 * 
	 * @param htmlfile Archivo con la pagina recibida
	 * @return Texto del archivo sin anotaciones HTML
	 * @throws IOException Si ocurre un error con el archivo
	 */
	protected String text(File htmlfile) throws IOException {
		String tex = HTMLProcessing.extractText(htmlfile);
		return tex;
	}

	/*
	 * Extrae las anotaciones HTML del texto recibido
	 * 
	 * @param htmlfile Texto que contiene anotaciones HTML
	 * @return Texto sin anotaciones HTML
	 * @throws IOException Si ocurre un error con la extracion de HTML
	 */
	protected String text(String htmlfile) throws IOException {
		String tex = HTMLProcessing.extractText(htmlfile);
		return tex;
	}

	/*
	 * Extrae los links de la pagina recibida
	 * 
	 * @param htmlfile Archivo con la pagina recibida
	 * @return Listado con los links de las paginas encontradas
	 * @throws IOException Si ocurre un error en la extraccion de links
	 */
	protected List<String> links(File htmlfile) throws IOException {
		List<String> links = HTMLProcessing.extractLinks(htmlfile);
		return links;
	}

	/*
	 * Extrae los links del texto recibido
	 * 
	 * @param htmlfile Texto que puede contener links
	 * @return Lista con los links de las paginas encontradas
	 * @throws IOException Si ocurre un problema en la extraccion de links
	 */
	protected List<String> links(String htmlfile) throws IOException {
		List<String> links = HTMLProcessing.extractLinks(htmlfile);
		return links;
	}

	/*
	 * Extrae los links de las imagenes contenidas en la pagina recibida
	 * 
	 * @param htmlfile Archivo que contiene la pagina recibida
	 * @return Lista con los links de las imagenes encontradas
	 * @throws IOException Si ocurre un error extrayendo los links de las imagenes 
	 */
	protected List<String> images(File htmlfile) throws IOException {
		List<String> links = HTMLProcessing.extractImageUrl(htmlfile);
		return links;
	}

	/*
	 * Extrae los links de las imagenes contenidas en el texto recibido
	 * 
	 * @param htmlfile Texto que puede contener vinculos de imagenes
	 * @return Lista con los links de las imagenes encontradas
	 * @throws IOException Si ocurre un error extrayendo los links de las imagenes 
	 */
	protected List<String> images(String htmlfile) throws IOException {
		List<String> links = HTMLProcessing.extractImageUrl(htmlfile);
		return links;
	}

}
